package cn.tedu.mall.resource.system;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

@Component
@Slf4j
public class FileUploadDirectoryChecker implements ApplicationRunner {

    @Value("${custom.file-upload.server-local-base-path}")
    private String fileUploadBasePath;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 检查上传的根文件夹
        log.debug("[文件上传：就绪] 保存上传文件的文件夹路径：{}", fileUploadBasePath);
        File fileUploadBaseDir = new File(fileUploadBasePath);
        if (!fileUploadBaseDir.isAbsolute()) {
            String errorMessage = "[文件上传：错误] 保存上传文件的文件夹路径不是绝对路径，请检查项目配置信息！";
            log.error("{}", errorMessage);
            throw new IOException(errorMessage);
        }

        if (fileUploadBaseDir.exists()) {
            log.debug("[文件上传：就绪] 保存上传文件的文件夹，存在。");
        } else {
            log.warn("[文件上传：就绪] 保存上传文件的文件夹，不存在。");
            boolean result = fileUploadBaseDir.mkdirs();
            if (result) {
                log.warn("[文件上传：就绪] 保存上传文件的文件夹，已创建（{}）。", fileUploadBaseDir.getAbsolutePath());
            } else {
                log.error("[文件上传：就绪] 保存上传文件的文件夹，无法创建（{}）。", fileUploadBaseDir.getAbsolutePath());
                throw new FileNotFoundException("无法创建保存上传文件的文件夹（"
                        + fileUploadBaseDir.getAbsolutePath() + "），请检查配置文件！");
            }
        }

        // 检查文件夹读写权限
        if (fileUploadBaseDir.canRead()) {
            log.debug("[文件上传：就绪] 保存上传文件的文件夹，读权限，正常。");
        } else {
            log.error("[文件上传：错误] 保存上传文件的文件夹，读权限，无。");
        }
        if (fileUploadBaseDir.canWrite()) {
            log.debug("[文件上传：就绪] 保存上传文件的文件夹，写权限，正常。");
        } else {
            log.error("[文件上传：错误] 保存上传文件的文件夹，写权限，无。");
        }

        // 测试写入临时文件
        log.debug("[文件上传：就绪] 即将测试写入临时文件……");
        File tempFile = File.createTempFile("csmall-", "-test.tmp", fileUploadBaseDir);
        log.debug("[文件上传：就绪] 写入临时文件（" + tempFile.getAbsolutePath() + "），正常。");
        tempFile.delete();
        log.debug("[文件上传：就绪] 删除临时文件。");
        log.debug("[文件上传：就绪] 检查完成。");
    }

}
